FluentdでS3にログを収集してみる
こんにちは、坂巻です。
今回は、ログ収集に関するエントリです。
AWSでログ収集といえば、CloudWatch Logsが挙げられますが、 今回はオープンソースのログ収集管理ツールFluentdを使用してみたいと思います。
最終的には他サービスを使用して、収集したログの可視化や分析してみたいと思いますが、 本エントリではS3にログが出力されるまでをゴールとします。
目次
- 構成
- 構築
- AWS環境
- Fluentdインストール
- Fluentd設定
- ログ確認
- さいごに
構成
以下のシンプルな構成です。
構築
AWS
AWS環境の構築はCloudFormationのテンプレートを用意したので割愛します。
上記テンプレートを利用してAWS環境を構築する際は、 スタックのパラメータに以下を設定してください。
- KeyPairName…EC2インスタンスにログインするキーペアを指定します。
- S3BucketName…作成するバケット名を指定します。
- SecurityGroupCidrIp…EC2にSSHでアクセスするCIDRを指定します。
なお、CloudFormationの利用方法がわからない方は、こちらのページを確認ください。
Fluentdインストール
インストールはワンライナーで行えます。 起動したEC2で以下のコマンドを実行します。
curl -L https://toolbelt.treasuredata.com/sh/install-amazon1-td-agent3.sh | sh
Installing Fluentd Using rpm Package
Fluentd設定
入力、出力の設定は/etc/td-agent/td-agent.conf
に記述していきます。
fluentdが何を受け取るか入力元の指定は``````ディレクティブで行います。 今回はsyslogを監視したいため、以下のように設定しました。
<source> @type tail path /var/log/messages tag td.messages.access pos_file /var/log/td-agent/messages.pos format syslog </source>
type
…入力プラグインを指定します。ここではtailを指定しています。path
…入力対象のファイルを指定します。tag
…ログにつけるタグを指定します。pos_file
…最後に読み込んだファイルの位置をこのファイルに記録します。format
…パーサプラグインを指定します。ここではsyslogを指定しています。
ディレクティブの情報に対する出力処理は
ディレクティブで行います。
今回はS3へ出力したいので、以下のように設定しました。
<match td.messages.access> @type s3 s3_bucket fluentd-test-20180421 s3_region ap-northeast-1 time_slice_format %Y%m%d%H%M </match>
``````ディレクティブ内のtag
で指定と一致させます。
type
…出力プラグインを指定します。ここではs3を指定しています。s3_bucket
…S3のバケット名を指定します。s3_region
…S3のバケットのリージョン名を指定します。time_slice_format
…出力ファイルに追加される時間のフォーマット形式を指定します。ファイルに書き出すタイミングの指定と考えてもよさそうです。
なお、今回はEC2にIAMロールを付与しているので、アクセスキーは使用しません。
収集ログに対する権限エラーにならないように、
/etc/init.d/td-agent
ファイルの下記箇所をtd-agent
からroot
に変更します。
TD_AGENT_DEFAULT=/etc/sysconfig/td-agent TD_AGENT_USER=root TD_AGENT_GROUP=root TD_AGENT_RUBY=/opt/td-agent/embedded/bin/ruby
設定を終えたらプロセスを再起動します。
$ sudo /etc/init.d/td-agent restart td-agentng td-agent: [ OK ]
ログがS3に出力されない等、想定した動作と異なる場合は、
/var/log/td-agent/td-agent.log
を確認しましょう。
ログ確認
``````ディレクティブで指定した、バケットにログが出力されていることが確認できました。
ログの中身も確認してみます。
2018-04-22T04:08:56+00:00 td.messages.access {"host":"ip-10-0-1-49","ident":"dhclient","pid":"2158","message":"XMT: Solicit on eth0, interval 125070ms."}
さいごに
次回は他のサービスを使い、収集したログを可視化や分析してみたいと思います。